{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# <center> Convolutional Neural Network\n",
    "\n",
    "### Convolutional Layers: [512] ; Dropout layer ; Dense Layers [512] ; Dropout layer\n",
    "\n",
    "CNN is trained on raw data"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <font color = 'blue'> Get the data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Stored variables and their in-db values:\n",
      "X_test              -> defaultdict(<class 'list'>, {0: array([[[ 0.003186\n",
      "X_train             -> array([[[-0.00119469, -0.00063007, -0.00049487, ..\n",
      "snrs                -> [-20, -18, -16, -14, -12, -10, -8, -6, -4, -2, 0, \n",
      "y_test              -> defaultdict(<class 'list'>, {0: array([7, 7, 1, ..\n",
      "y_train             -> array([3, 4, 5, ..., 0, 4, 5])\n"
     ]
    }
   ],
   "source": [
    "import warnings\n",
    "warnings.filterwarnings('ignore')\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from collections import defaultdict\n",
    "from time import time\n",
    "\n",
    "%store -r\n",
    "%store"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training data:  (80000, 2, 128) and labels:  (80000,)\n",
      "\n",
      "Test data:\n",
      "Total 20 (4000, 2, 128) arrays for SNR values:\n",
      "[-20, -18, -16, -14, -12, -10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18]\n"
     ]
    }
   ],
   "source": [
    "print(\"Training data: \", X_train.shape, \"and labels: \", y_train.shape)\n",
    "print()\n",
    "print(\"Test data:\")\n",
    "print(\"Total\", len(X_test), X_test[18].shape, \"arrays for SNR values:\")\n",
    "print(sorted(X_test.keys()))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <font color = 'blue'> Standardize the features"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Training set (80000, 2, 128)\n",
      "Test set corresponding to one snr value (4000, 2, 128)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.preprocessing import StandardScaler\n",
    "\n",
    "sc = StandardScaler()\n",
    "_X_train = np.reshape(X_train, [X_train.shape[0], X_train.shape[1]*X_train.shape[2]])\n",
    "_X_train = sc.fit_transform(_X_train)\n",
    "\n",
    "X_train = np.reshape(_X_train, X_train.shape)\n",
    "print(\"Training set\", X_train.shape)\n",
    "\n",
    "_X_test = defaultdict(list)\n",
    "for snr in snrs:\n",
    "    _X_test[snr] = np.reshape(X_test[snr], [X_test[snr].shape[0], X_test[snr].shape[1]*X_test[snr].shape[2]])\n",
    "    _X_test[snr] = sc.transform(_X_test[snr])\n",
    "    X_test[snr] = np.reshape(_X_test[snr], X_test[snr].shape)\n",
    "    \n",
    "print(\"Test set corresponding to one snr value\", X_test[18].shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <font color = 'blue'> Design and train the CNN"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 0 training accuracy : 0.2197265625\n",
      "INFO:tensorflow:Restoring parameters from ./CNN_single_conv_dropout2.4\n",
      "Epoch 1 training accuracy : 0.2734375\n",
      "INFO:tensorflow:Restoring parameters from ./CNN_single_conv_dropout2.4\n",
      "Epoch 2 training accuracy : 0.3193359375\n",
      "INFO:tensorflow:Restoring parameters from ./CNN_single_conv_dropout2.4\n",
      "Epoch 3 training accuracy : 0.4091796875\n",
      "INFO:tensorflow:Restoring parameters from ./CNN_single_conv_dropout2.4\n",
      "Epoch 4 training accuracy : 0.419921875\n",
      "INFO:tensorflow:Restoring parameters from ./CNN_single_conv_dropout2.4\n",
      "Epoch 5 training accuracy : 0.4365234375\n",
      "INFO:tensorflow:Restoring parameters from ./CNN_single_conv_dropout2.4\n",
      "Epoch 6 training accuracy : 0.453125\n",
      "INFO:tensorflow:Restoring parameters from ./CNN_single_conv_dropout2.4\n",
      "Epoch 7 training accuracy : 0.466796875\n",
      "INFO:tensorflow:Restoring parameters from ./CNN_single_conv_dropout2.4\n",
      "Epoch 8 training accuracy : 0.466796875\n",
      "INFO:tensorflow:Restoring parameters from ./CNN_single_conv_dropout2.4\n",
      "Epoch 9 training accuracy : 0.4677734375\n",
      "INFO:tensorflow:Restoring parameters from ./CNN_single_conv_dropout2.4\n",
      "INFO:tensorflow:Restoring parameters from ./CNN_single_conv_dropout2.4\n",
      "Training took 44.416345 minutes\n"
     ]
    }
   ],
   "source": [
    "height = 2\n",
    "width = 128\n",
    "channels = 1\n",
    "n_features = height * width\n",
    "\n",
    "feature_map1 = 512\n",
    "ksize_conv1 = 2\n",
    "stride_conv1 = 1\n",
    "conv1_dropout_rate = 0.4\n",
    "\n",
    "pool_layer_maps1 = 512\n",
    "\n",
    "n_fully_conn1 = 512\n",
    "dense1_dropout_rate = conv1_dropout_rate\n",
    "\n",
    "n_classes = 8\n",
    "  \n",
    "X = tf.placeholder(tf.float32, shape=[None, height, width])\n",
    "X_reshaped = tf.reshape(X, shape=[-1, height, width, channels])\n",
    "labels = tf.placeholder(tf.int32, shape=[None])\n",
    "training_ = tf.placeholder_with_default(False, shape=[])\n",
    "\n",
    "xavier_init = tf.contrib.layers.xavier_initializer()\n",
    "relu_act = tf.nn.relu\n",
    "\n",
    "# ------------------ Convolutional and dropout layers ----------------------------\n",
    "\n",
    "def convolutional_layer(X, filter_, ksize, kernel_init, strides, padding):\n",
    "    convolutional_layer = tf.layers.conv2d(X, filters = filter_, kernel_initializer = kernel_init,\n",
    "                                           kernel_size = ksize, strides = strides,\n",
    "                                          padding = padding, activation = relu_act)\n",
    "    return convolutional_layer\n",
    "\n",
    "conv_layer1 = convolutional_layer(X_reshaped, feature_map1, ksize_conv1, xavier_init, stride_conv1, padding = \"SAME\")\n",
    "\n",
    "def drop_out(layer, rate):\n",
    "    dropout_layer = tf.layers.dropout(layer, rate, training = training_)\n",
    "    return dropout_layer\n",
    "    \n",
    "conv1_dropout = drop_out(conv_layer1, conv1_dropout_rate)\n",
    "\n",
    "# ----------------- Pooling layers -------------------------------------\n",
    "\n",
    "def pooling_layer(convlayer, ksize, strides, padding, pool_maps):\n",
    "    pool = tf.nn.max_pool(convlayer, ksize, strides, padding)\n",
    "    dim1, dim2 = int(pool.get_shape()[1]), int(pool.get_shape()[2])\n",
    "    pool_flat = tf.reshape(pool, shape = [-1, pool_maps * dim1 * dim2])\n",
    "    return pool_flat\n",
    "\n",
    "pool_layer1_flat = pooling_layer(conv1_dropout, [1,2,2,1], [1,2,2,1], \"VALID\", pool_layer_maps1)\n",
    "\n",
    "# ----------------- Fully connected and dropout layers -------------------\n",
    "\n",
    "def dense_layer(input_layer, n_neurons, kernel_init, activation):\n",
    "    fully_conn = tf.layers.dense(inputs = input_layer, units = n_neurons, activation = activation,\n",
    "                                kernel_initializer = kernel_init)\n",
    "    return fully_conn\n",
    "        \n",
    "dense_layer1 = dense_layer(pool_layer1_flat, n_fully_conn1, xavier_init, relu_act)\n",
    "\n",
    "dense1_dropout = drop_out(dense_layer1, dense1_dropout_rate)\n",
    "\n",
    "# ----------------- Output softmax layer ---------------------------\n",
    "\n",
    "logits = tf.layers.dense(dense1_dropout, n_classes)\n",
    "softmax_activations = tf.nn.softmax(logits)\n",
    "\n",
    "# ----------------- Specify performance measure -------------------------------\n",
    "\n",
    "cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits = logits, labels = labels)\n",
    "loss = tf.reduce_mean(cross_entropy)\n",
    "optimizer = tf.train.AdamOptimizer()\n",
    "train_operation = optimizer.minimize(loss)\n",
    "\n",
    "correct_predictions = tf.nn.in_top_k(logits, labels, 1)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_predictions, tf.float32))\n",
    "\n",
    "# ---------------- Execution phase -------------------------------------------\n",
    "    \n",
    "n_epochs = 10\n",
    "batch_size = 1024\n",
    "n_train = X_train.shape[0]\n",
    "n_iter = n_train//batch_size\n",
    "\n",
    "acc_test = defaultdict(list)\n",
    "\n",
    "path = \"./CNN_single_conv_dropout2.4\"  \n",
    "saver = tf.train.Saver()\n",
    "\n",
    "start = time()\n",
    "\n",
    "with tf.Session() as sess:\n",
    "    tf.global_variables_initializer().run()\n",
    "    for epoch in range(n_epochs):\n",
    "        for iteration in range(n_iter):\n",
    "            rand_indices = np.random.choice(n_train,batch_size)    \n",
    "            X_batch, y_batch = X_train[rand_indices], y_train[rand_indices]\n",
    "            sess.run(train_operation, feed_dict={X: X_batch, labels: y_batch, training_: True})\n",
    "        acc_train = accuracy.eval(feed_dict={X: X_batch, labels: y_batch})\n",
    "        print(\"Epoch {} training accuracy : {}\".format(epoch, acc_train))\n",
    "        save_path = saver.save(sess, path)\n",
    "        saver.restore(sess, path)\n",
    "    saver.restore(sess, path)\n",
    "    for snr in snrs:\n",
    "        acc_test[snr] = accuracy.eval(feed_dict={X: X_test[snr], labels: y_test[snr]})\n",
    "\n",
    "print(\"Training took %f minutes\"%(float(time() - start)/60.0))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <font color = 'blue'> Test the classifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "CNN's test accuracy on -20dB SNR samples = 0.11874999850988388\n",
      "CNN's test accuracy on -18dB SNR samples = 0.12925000488758087\n",
      "CNN's test accuracy on -16dB SNR samples = 0.12950000166893005\n",
      "CNN's test accuracy on -14dB SNR samples = 0.12825000286102295\n",
      "CNN's test accuracy on -12dB SNR samples = 0.14124999940395355\n",
      "CNN's test accuracy on -10dB SNR samples = 0.2004999965429306\n",
      "CNN's test accuracy on -8dB SNR samples = 0.30125001072883606\n",
      "CNN's test accuracy on -6dB SNR samples = 0.3957499861717224\n",
      "CNN's test accuracy on -4dB SNR samples = 0.43424999713897705\n",
      "CNN's test accuracy on -2dB SNR samples = 0.43950000405311584\n",
      "CNN's test accuracy on 0dB SNR samples = 0.4794999957084656\n",
      "CNN's test accuracy on 2dB SNR samples = 0.5659999847412109\n",
      "CNN's test accuracy on 4dB SNR samples = 0.6262500286102295\n",
      "CNN's test accuracy on 6dB SNR samples = 0.6537500023841858\n",
      "CNN's test accuracy on 8dB SNR samples = 0.656000018119812\n",
      "CNN's test accuracy on 10dB SNR samples = 0.6690000295639038\n",
      "CNN's test accuracy on 12dB SNR samples = 0.6652500033378601\n",
      "CNN's test accuracy on 14dB SNR samples = 0.6629999876022339\n",
      "CNN's test accuracy on 16dB SNR samples = 0.6600000262260437\n",
      "CNN's test accuracy on 18dB SNR samples = 0.6685000061988831\n"
     ]
    }
   ],
   "source": [
    "for snr in snrs:\n",
    "    print(\"CNN's test accuracy on {}dB SNR samples = {}\".format(snr,acc_test[snr]))  "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## <font color = 'blue'> Visualize classifier's performance on test set"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f87cc2874a8>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.style.use('classic')\n",
    "%matplotlib inline\n",
    "\n",
    "acc_test = sorted(acc_test.items())\n",
    "new_acc = []\n",
    "for i in range(len(acc_test)):\n",
    "    new_acc.append(acc_test[i][1])\n",
    "acc_test_values = new_acc \n",
    "\n",
    "fig1 = plt.figure(figsize=(10, 6), dpi=100)\n",
    "x = snrs\n",
    "y = list(acc_test_values)\n",
    "plt.plot(x, y, marker=\"o\", linewidth=2.0, linestyle='dashed', color='royalblue')\n",
    "plt.axis([-20, 20, 0, 1])\n",
    "plt.xticks(np.arange(min(x), max(x)+1, 2.0))\n",
    "plt.yticks(np.arange(0, 1, 0.10))\n",
    "\n",
    "ttl = plt.title('SNR vs Accuracy', fontsize=16)\n",
    "ttl.set_weight('bold')\n",
    "plt.xlabel('SNR (dB)', fontsize=14)\n",
    "plt.ylabel('Test accuracy', fontsize=14)\n",
    "plt.grid()\n",
    "\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./CNN_single_conv_dropout2.4\n",
      "Confusion Matrix\n",
      "       8PSK  BPSK  CPFSK  GFSK  PAM4  QAM16  QAM64  QPSK\n",
      "8PSK   0.50  0.03   0.07  0.00  0.00   0.03   0.03  0.33\n",
      "BPSK   0.02  0.92   0.00  0.00  0.02   0.01   0.01  0.03\n",
      "CPFSK  0.00  0.00   0.86  0.13  0.00   0.00   0.00  0.01\n",
      "GFSK   0.00  0.00   0.02  0.97  0.00   0.00   0.00  0.00\n",
      "PAM4   0.00  0.12   0.00  0.00  0.84   0.02   0.01  0.00\n",
      "QAM16  0.41  0.00   0.00  0.00  0.00   0.14   0.16  0.29\n",
      "QAM64  0.06  0.00   0.00  0.00  0.00   0.43   0.45  0.06\n",
      "QPSK   0.46  0.00   0.03  0.00  0.00   0.03   0.01  0.47\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f87c228b668>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Confusion Matrix\n",
    "\n",
    "with tf.Session() as sess:\n",
    "    saver.restore(sess, path)\n",
    "    Z = logits.eval(feed_dict = {X : X_test[18]})\n",
    "    predicted_18dB = np.argmax(Z, axis = 1)\n",
    "    \n",
    "from sklearn.metrics import confusion_matrix\n",
    "%matplotlib inline\n",
    "\n",
    "classes = ['8PSK', 'BPSK', 'CPFSK', 'GFSK', 'PAM4', 'QAM16', 'QAM64', 'QPSK']\n",
    "conf_matrix = confusion_matrix(predicted_18dB, y_test[18])  \n",
    "\n",
    "conf_matrix = conf_matrix.astype('float') / conf_matrix.sum(axis=1)[:, np.newaxis]\n",
    "conf_matrix = conf_matrix.round(decimals = 2)\n",
    "\n",
    "import pandas as pd\n",
    "\n",
    "df = pd.DataFrame(data = conf_matrix, columns = classes, index = classes) \n",
    "print(\"Confusion Matrix\")\n",
    "print(df)\n",
    "\n",
    "fig1 = plt.figure(figsize=(10, 6), dpi=100)\n",
    "plt.imshow(conf_matrix, interpolation = 'nearest', cmap = plt.cm.Purples)\n",
    "ticks = np.arange(len(classes))\n",
    "plt.title(\"Confusion Matrix\")\n",
    "plt.xticks(ticks, classes, rotation=45)\n",
    "plt.yticks(ticks, classes)\n",
    "\n",
    "plt.ylabel('True class')\n",
    "plt.xlabel('Predicted class')\n",
    "\n",
    "plt.tight_layout()\n",
    "plt.colorbar()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  },
  "widgets": {
   "state": {},
   "version": "1.1.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
